Fork me on GitHub

第2章 排序 || 2.13 小范围排序练习题

题目


已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。

给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
测试样例:

[2,1,4,3,6,5,8,7,10,9],10,2

返回:[1,2,3,4,5,6,7,8,9,10]

解析

class ScaleSort {
public:
	vector<int> sortElement_1(vector<int> A, int n, int k) {
		// write code here
		sort(A.begin(), A.end());
		return A;
	}

	void headAdjust(vector<int> &src,int root,int size) //调整为小顶堆;必须加引用,传地址
	{
		int temp = src[root];
		for (int child = 2 * root + 1; child < size;child=2*child+1)
		{
			if (child+1<size&&src[child]>src[child+1]) //右孩子小
			{
				child++;
			}
			if (temp<src[child])
			{
				break;
			}
			src[root] = src[child];
			root = child;
		}
		src[root] = temp;
		return;
	}

	vector<int> sortElement(vector<int> A, int n, int k) {
		// write code here
		if (n==0||n<k)
		{
			return A;
		}
		vector<int> B; //含有k个元素
		for (int i = 0; i < k;i++)
		{
			B.push_back(A[i]);
		}
		//创建小顶堆,即调整堆得过程
		for (int i = k / 2-1; i >= 0;i--)
		{
			headAdjust(B,i,k);
		}
		for (int i = k; i < n;i++)
		{
			A[i - k] = B[0]; //交换堆顶元素
			B[0] = A[i];
			headAdjust(B, 0, k);
		}
		//最后k个元素堆排序
		for (int i = n - k; i < n; i++)
		{
			A[i] = B[0];
			swap(B[k-1],B[0]);
			headAdjust(B, 0, --k);
		}
		return A;
	}


};

题目来源

posted @ 2018-05-24 18:03  ranjiewen  阅读(221)  评论(0编辑  收藏  举报